package config

import (
	"github.com/fsnotify/fsnotify"
	"github.com/lexkong/log"
	"github.com/spf13/viper"
	"strings"
)

type Config struct {
	Name string
}

//初始化配置
func (c *Config) initConfig() (err error) {
	if c.Name != "" {
		// 如果指定了配置文件，则解析指定的配置文件
		viper.SetConfigName(c.Name)
	} else {
		// 没有指定，读取默认的路径的配置文件
		viper.AddConfigPath("conf")
		viper.SetConfigName("config")
	}
	//设置配置的类型为yaml
	viper.SetConfigType("yaml")
	//自动读取匹配的环境变量
	viper.AutomaticEnv()
	// 读取环境变量的前缀为APISERVER
	viper.SetEnvPrefix("APISERVER")
	replacer := strings.NewReplacer(".", "_")
	viper.SetEnvKeyReplacer(replacer)
	if err := viper.ReadInConfig(); err != nil {
		return err
	}
	return nil
}

func (c *Config) initLog() {
	passLagerCfg := log.PassLagerCfg{
		//writers：输出位置，有两个可选项 —— file 和 stdout。
		// 选择 file 会将日志记录到 logger_file 指定的日志文件中，
		// 选择 stdout 会将日志输出到标准输出，当然也可以两者同时选择
		Writers: viper.GetString("log.writers"),
		//logger_level：日志级别，DEBUG、INFO、WARN、ERROR、FATAL
		LoggerLevel: viper.GetString("log.logger_level"),
		//logger_file：日志文件
		LoggerFile: viper.GetString("log.logger_file"),
		//log_format_text：日志的输出格式，JSON 或者 plaintext
		//true 会输出成非 JSON 格式，false 会输出成 JSON 格式
		LogFormatText: viper.GetBool("log.log_format_text"),
		//rollingPolicy：rotate 依据，
		//可选的有 daily 和 size。如果选 daily 则根据天进行转存，如果是 size 则根据大小进行转存
		RollingPolicy: viper.GetString("log.rollingPolicy"),
		//log_rotate_date：rotate 转存时间，配 合rollingPolicy: daily 使用
		LogRotateDate: viper.GetInt("log.log_rotate_date"),
		//log_rotate_size：rotate 转存大小，配合 rollingPolicy: size 使用
		LogRotateSize: viper.GetInt("log.log_rotate_size"),
		//log_backup_count：当日志文件达到转存标准时，log 系统会将该日志文件进行压缩备份，这里指定了备份文件的最大个数
		LogBackupCount: viper.GetInt("log.log_backup_count"),
	}
	log.InitWithConfig(&passLagerCfg)
}

func (c *Config) watchConfig() {
	//监控配置文件并进行热加载
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		log.Infof("Config file change : %s", e.Name)
	})
}
func Init(cfg string) error {
	c := Config{Name: cfg}
	if err := c.initConfig(); err != nil {
		return err
	}
	// 初始化日志包
	c.initLog()
	// 监控并做热更新
	c.watchConfig()
	return nil

}
